﻿Imports System.Reflection

''' <summary>
''' 主キー属性読み込みクラス
''' </summary>
''' <remarks></remarks>
Public Class KeyAttributeReader

    ''' <summary>
    ''' 読み込み、生成処理の関数を示します
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks>差し替え可能です。</remarks>
    Public Shared Property Creater As Func(Of PropertyInfo, IEnumerable(Of KeyAttribute)) = AddressOf (New KeyAttributeFactory).Create

    ''' <summary>
    ''' キャッシュ
    ''' </summary>
    ''' <remarks></remarks>
    Private Shared Caches As New Dictionary(Of PropertyInfo, List(Of KeyAttribute))

    ''' <summary>
    ''' 属性を取得します。存在しない場合は制約上の属性が返されます
    ''' </summary>
    ''' <param name="prop"></param>
    ''' <returns></returns>
    ''' <remarks>キャッシュを使用しています。</remarks>
    Public Shared Function Read(ByVal prop As PropertyInfo) As IEnumerable(Of KeyAttribute)
        'キャッシュがない場合は生成
        If Caches.ContainsKey(prop) = False Then Caches.Add(prop, Creater.Invoke(prop))
        Return Caches(prop)
    End Function

End Class
